﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

//测试文件的打开和关闭
void test1()
{
	//打开文件
	//相对路径——在对应的工程下创建文件
	FILE* pf1 = fopen("test.txt", "r");
	//绝对路径——可以直接查看文件属性，将路径复制下来
	FILE* pf2 = fopen("C:\\Users\\admin\\Desktop\\test.txt", "w");//注意转义字符
	if (pf1 == NULL || pf2 == NULL)//判断文件是否打开成功
	{
		perror("fopen");
		return;
	}
	//读写

	//关闭文件
	fclose(pf1);
	pf1 = NULL;//将pf置空
	fclose(pf2);
	pf2 = NULL;
}

//测试fputc
void test2()
{
	//打开文件
	FILE* pf = fopen("C:\\Users\\admin\\Desktop\\test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	//写文件
	//把26个字母写到文件中
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		int n = fputc('a' + i, pf);//fputc返回的是写入的那个字符的ASCII码值
		printf("%c ", n);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
}

//测试fgetc
void test3()
{
	//打开文件
	FILE* pf = fopen("C:\\Users\\admin\\Desktop\\test.txt", "r");//以只读方式打开文件
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	//读文件
	int i = 0;
	char ch = 0;
	for (i = 0; i < 26; i++)//这里如果读更多的字符，会什么也读不到
	{
		ch = fgetc(pf);
		printf("%c ", ch);
	}
	printf("\n");

	//关闭文件
	fclose(pf);
	pf = NULL;
}

//测试fputs
void test4()
{
	FILE* pf = fopen("C:\\Users\\admin\\Desktop\\test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	//写一行数据hello world
	fputs("hello world\n", pf);//这里如果不加\n，下一行数据会不换行输出
	//再写一行
	fputs("hello world\n", pf);

	//关闭文件
	fclose(pf);
	pf = NULL;
}

//测试fgets
void test5()
{
	FILE* pf = fopen("C:\\Users\\admin\\Desktop\\test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	//读一行数据
	char str[20];
	fgets(str, 5, pf);//这里实际上只能拿到4个字符，第五个为\0，是函数自己给的
	printf("%s\n", str);
	//这里会从上一次读到的地方开始继续向下读，上次只读了4个字符，那么下次开头读的就是字符o
	fgets(str, 20, pf);
	//函数读到\n，就不会再往下读了，这一点可以通过调试查看
	//\0是一定会放进目标空间的，\n后放的就是\0
	printf("%s\n", str);

	//关闭文件
	fclose(pf);
	pf = NULL;
}

//测试格式化的输入输出
struct S
{
	int n;
	float f;
	char arr[20];
};

//测试fprintf
void test6()
{
	struct S s = { 10,3.14,"张三" };
	FILE* pf = fopen("C:\\Users\\admin\\Desktop\\test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	//写文件
	fprintf(pf, "%d %f %s\n", s.n, s.f, s.arr);
	//关闭文件
	fclose(pf);
	pf = NULL;
}

//测试fscanf
void test7()
{
	struct S s;
	FILE* pf = fopen("C:\\Users\\admin\\Desktop\\test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	//读文件
	fscanf(pf, "%d %f %s", &(s.n), &(s.f), s.arr);
	printf("%d %f %s\n", s.n, s.f, s.arr);
	//关闭文件
	fclose(pf);
	pf = NULL;
}

int main()
{
	//test1();
	//test2();//2,3一起测试
	//test3();
	//test4();//4,5一起测试
	//test5();
	test6();//6,7一起测试
	test7();
	return 0;
}

